calendar: Use the new "%OB" format if supported
authorRafal Luzynski <digitalfreak@lingonborough.com>
Sat, 10 Feb 2018 13:07:56 +0000 (14:07 +0100)
committerRafal Luzynski <digitalfreak@lingonborough.com>
Mon, 12 Feb 2018 21:09:28 +0000 (22:09 +0100)
Due to the recent changes introduced in glibc 2.27 "%OB" is the
correct format to obtain a month name as used in the calendar
header.  The same rule has been working in BSD family (including
OS X) since 1990s.  This simple hack checks whether "%OB" is supported
at runtime and uses it if it is, falls back to the old "%B" otherwise.

Closes: #9
gtk/gtkcalendar.c

index 94233333d59bb9e33b139779bcf62002a5d2926d..5f1a5d5a7785cbb500ab5254e975cdb625debb68 100644 (file)
@@ -694,6 +694,7 @@ gtk_calendar_init (GtkCalendar *calendar)
 #ifdef G_OS_WIN32
   wchar_t wbuffer[100];
 #else
+  static const char *month_format = NULL;
   char buffer[255];
   time_t tmp_time;
 #endif
@@ -718,7 +719,7 @@ gtk_calendar_init (GtkCalendar *calendar)
       {
 #ifndef G_OS_WIN32
         tmp_time= (i+3)*86400;
-        strftime ( buffer, sizeof (buffer), "%a", gmtime (&tmp_time));
+        strftime (buffer, sizeof (buffer), "%a", gmtime (&tmp_time));
         default_abbreviated_dayname[i] = g_locale_to_utf8 (buffer, -1, NULL, NULL, NULL);
 #else
         if (!GetLocaleInfoW (GetThreadLocale (), LOCALE_SABBREVDAYNAME1 + (i+6)%7,
@@ -734,7 +735,21 @@ gtk_calendar_init (GtkCalendar *calendar)
       {
 #ifndef G_OS_WIN32
         tmp_time=i*2764800;
-        strftime ( buffer, sizeof (buffer), "%B", gmtime (&tmp_time));
+        if (G_UNLIKELY (month_format == NULL))
+          {
+            buffer[0] = '\0';
+            month_format = "%OB";
+            strftime (buffer, sizeof (buffer), month_format, gmtime (&tmp_time));
+            /* "%OB" is not supported in Linux with glibc < 2.27  */
+            if (!strcmp (buffer, "%OB") || !strcmp (buffer, "OB") || !strcmp (buffer, ""))
+              {
+                month_format = "%B";
+                strftime (buffer, sizeof (buffer), month_format, gmtime (&tmp_time));
+              }
+          }
+        else
+          strftime (buffer, sizeof (buffer), month_format, gmtime (&tmp_time));
+
         default_monthname[i] = g_locale_to_utf8 (buffer, -1, NULL, NULL, NULL);
 #else
         if (!GetLocaleInfoW (GetThreadLocale (), LOCALE_SMONTHNAME1 + i,